Bug 553803 – eventually call XCloseDevice on XOpenDevice results
authorMatthias Clasen <matthiasc@src.gnome.org>
Sat, 27 Sep 2008 00:47:45 +0000 (00:47 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sat, 27 Sep 2008 00:47:45 +0000 (00:47 +0000)
        * gdk/x11/gdkinput.c: Add a finalize function for device objects,
        and call XCloseDevice there.

        * gdk/x11/gdkinput-x11.c:
        * gdk/x11/gdkdisplay-x11.c: Move freeing of device objects to
        the finalize function.
        Patch by Caolan McNamara

svn path=/trunk/; revision=21529

ChangeLog
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput.c

index b9ce2cdf9e13c8cdbd09503362a860a112b0f27e..f7b179f19d5f6f9507f444cb99aa7ff945cb0d7f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2008-09-26  Matthias Clasen  <mclasen@redhat.com>
+       
+       Bug 553803 – eventually call XCloseDevice on XOpenDevice results
+
+       * gdk/x11/gdkinput.c: Add a finalize function for device objects,
+       and call XCloseDevice there. 
+
+       * gdk/x11/gdkinput-x11.c:
+       * gdk/x11/gdkdisplay-x11.c: Move freeing of device objects to
+       the finalize function.
+       Patch by Caolan McNamara
+       
 2008-09-26  Matthias Clasen  <mclasen@redhat.com>
 
        Bug 553578 - tabs are not drawn correctly
index 08b77da0e45a8e99f8e56abf3fdcd6b3d6f9deb3..d791975155d3947d4de0b2c9a92833b95934dc5c 100644 (file)
@@ -830,7 +830,6 @@ gdk_display_x11_finalize (GObject *object)
   g_slist_free (display_x11->event_types);
 
   /* input GdkDevice list */
-  /* FIXME need to write finalize fct */
   g_list_foreach (display_x11->input_devices, (GFunc) g_object_unref, NULL);
   g_list_free (display_x11->input_devices);
 
index deeb8422b044f4726f08e60a375b4a003524e795..8faf7048459c1f20fc672bbfe82a81c8ac707e5b 100644 (file)
@@ -246,10 +246,6 @@ gdk_input_device_new (GdkDisplay  *display,
 
  error:
 
-  g_free (gdkdev->info.name);
-  g_free (gdkdev->axes);
-  g_free (gdkdev->info.keys);
-  g_free (gdkdev->info.axes);
   g_object_unref (gdkdev);
   
   return NULL;
index 98840bb0a43207c0a816f10c5432e1d903eb141a..4f2159f5f6344d64d9319e34d489719b26b019bc 100644 (file)
@@ -63,6 +63,9 @@ _gdk_init_input_core (GdkDisplay *display)
   private->display = display;
 }
 
+static void gdk_device_class_init (GdkDeviceClass *klass);
+static void gdk_device_finalize (GObject *object);
+
 GType
 gdk_device_get_type (void)
 {
@@ -75,7 +78,7 @@ gdk_device_get_type (void)
          sizeof (GdkDeviceClass),
          (GBaseInitFunc) NULL,
          (GBaseFinalizeFunc) NULL,
-         (GClassInitFunc) NULL,
+         (GClassInitFunc) gdk_device_class_init,
          NULL,           /* class_finalize */
          NULL,           /* class_data */
          sizeof (GdkDevicePrivate),
@@ -91,6 +94,33 @@ gdk_device_get_type (void)
   return object_type;
 }
 
+static void
+gdk_device_class_init (GdkDeviceClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = gdk_device_finalize;
+}
+
+static void
+gdk_device_finalize (GObject *object)
+{
+  GdkDevicePrivate *gdkdev = (GdkDevicePrivate *)GDK_DEVICE(object);
+
+  if (!GDK_IS_CORE (gdkdev))
+  {
+#ifndef XINPUT_NONE
+    if (gdkdev->xdevice)
+      XCloseDevice (GDK_DISPLAY_XDISPLAY(gdkdev->display), gdkdev->xdevice);
+    g_free (gdkdev->axes);
+#endif /* !XINPUT_NONE */
+
+    g_free (gdkdev->info.name);
+    g_free (gdkdev->info.keys);
+    g_free (gdkdev->info.axes);
+  }
+}
+
 /**
  * gdk_devices_list:
  *
@@ -403,14 +433,7 @@ _gdk_input_exit (void)
          if (!GDK_IS_CORE (gdkdev))
            {
              gdk_device_set_mode (&gdkdev->info, GDK_MODE_DISABLED);
-             
-             g_free(gdkdev->info.name);
-#ifndef XINPUT_NONE      
-             g_free(gdkdev->axes);
-#endif   
-             g_free(gdkdev->info.axes);
-             g_free(gdkdev->info.keys);
-             g_free(gdkdev);
+             g_object_unref(gdkdev);
            }
        }